﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SalaDeEnsayo.ApplicationService.Model.Entity;

namespace SalaDeEnsayo.ApplicationService
{
    public class ProductoService : BaseService
    {
        #region [ Metodos Publicos ]
        /*
        public List<Producto> GetAll()
        {
            List<Producto> listaProducto = new List<Producto>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("ProductosObtener"))
            {
                while (dr.Read())
                {
                    listaProducto.Add(GetEntity(dr));
                }
            }
            return listaProducto;
        }
        */
       public List<Producto> ObtenerTodos()
       {
           List<Producto> listaProducto = new List<Producto>();
           using (var dr = this.SalaDeEnsayoDB.ExecuteReader("ProductoObtener"))
           {
               while (dr.Read())
               {
                   listaProducto.Add(GetEntity(dr));
               }
           }
           return listaProducto;
       }

       public List<Producto> ObtenerPorIdTipo(int idTipo)
       {
           List<Producto> listaProducto = new List<Producto>();
           using (var dr = this.SalaDeEnsayoDB.ExecuteReader("PoductoObtenerPorTipo", idTipo))
           {
               while (dr.Read())
               {
                   listaProducto.Add(GetEntity(dr));
               }
           }
           return listaProducto;
       }

        public List<ProductoDTO> Listar(string filtro)
        {
            List<ProductoDTO> lista = new List<ProductoDTO>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("ProductosObtener", filtro))
            {
                while (dr.Read())
                {
                    lista.Add(GetEntityDTO(dr));
                }
            }
            return lista;
        }

        public Producto ObtenerPorId(long id)
        {
            Producto Producto = new Producto();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("ProductosObtenerPorId", id))
            {
                if (dr.Read())
                {
                    Producto = GetEntity(dr);
                    return Producto;
                }
            }
            return Producto;
        }

        public int AgregarProducto(Producto Producto)
        {
            Object[] parms = new Object[5];
            parms[0] = Producto.Descripcion;
            parms[1] = Producto.Id_tipo;
            parms[2] = Producto.Costo;
            parms[3] = Producto.Precio_Venta;
            parms[4] = Producto.Cantidad;
            try
            {
                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("ProductosAgregar", parms);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public int EliminarProducto(long id)
        {
            try
            {
                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("ProductosEliminar", id);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public int ModificarProducto(Producto newProd)
        {
            Object[] parms = new Object[6];
            try
            {
                parms[0] = newProd.Id_Producto;
                parms[1] = newProd.Descripcion;
                parms[2] = newProd.Id_tipo;
                parms[3] = newProd.Costo;
                parms[4] = newProd.Precio_Venta;
                parms[5] = newProd.Cantidad;

                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("ProductosModificar", parms);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public int ModificarProductoStock(Producto newProd)
        {
            Object[] parms = new Object[2];
            try
            {
                parms[0] = newProd.Id_Producto;
                parms[1] = newProd.Cantidad;

                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("ProductosModificarStock", parms);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public decimal ObtenerPrecio(long id)
        {

            return (decimal)this.SalaDeEnsayoDB.ExecuteScalar("ProductoObtenerPrecio", id);

        }

        public long ObtenerStock(long id)
        {

            return (long)this.SalaDeEnsayoDB.ExecuteScalar("ProductoObtenerStock", id);

        }

        public long RestarStock(long id_producto, long cant)
        {
            Object[] parms = new Object[2];
            parms[0] = id_producto;
            parms[1] = cant;

            return (int)this.SalaDeEnsayoDB.ExecuteNonQuery("ProductosRestarStock", parms);

        }

        public Boolean PuedeInsetar(string producto, int tipo)
        {
            Object[] parms = new Object[2];
            parms[0] = producto;
            parms[1] = tipo;


            if ((int)this.SalaDeEnsayoDB.ExecuteScalar("ProductosPuedeInsertar", parms) == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
 
        }

        #endregion

        #region [ Metodos Privados ]

        private Producto GetEntity(System.Data.IDataReader dr)
        {
            return new Producto(dr["id_producto"] is System.DBNull ? 0 : (long)dr["id_producto"],
                                dr["descripcion"] is System.DBNull ? string.Empty : (string)dr["descripcion"],
                                dr["id_tipo"] is System.DBNull ? 0 : (int)dr["id_tipo"],
                                dr["costo"] is System.DBNull ? 0 : (decimal)dr["costo"],
                                dr["precio_venta"] is System.DBNull ? 0 : (decimal)dr["precio_venta"],
                                dr["cantidad"] is System.DBNull ? 0 : (long)dr["cantidad"]);
        }

        private ProductoDTO GetEntityDTO(System.Data.IDataReader dr)
        {
            return new ProductoDTO(dr["id_producto"] is System.DBNull ? 0 : (long)dr["id_producto"],
                                  dr["descripcion"] is System.DBNull ? string.Empty : (string)dr["descripcion"],
                                  dr["id_tipo"] is System.DBNull ? 0: (int)dr["id_tipo"],
                                  dr["descripcionT"] is System.DBNull ? string.Empty : (string)dr["descripcionT"],
                                  dr["costo"] is System.DBNull ? 0 : (decimal)dr["costo"],
                                  dr["precio_venta"] is System.DBNull ? 0 : (decimal)dr["precio_venta"],
                                  dr["cantidad"] is System.DBNull ? 0 : (long)dr["cantidad"]);
        }

        #endregion
    }

    public class ProductoDTO
    {
        public ProductoDTO(long producto, string desc, int tipo, string descripcionT, decimal costo, decimal precio_v, long cant)
        {
            this.Id_Producto = producto;
            this.Descripcion = desc;
            this.Id_Tipo = tipo;
            this.descripcionT = descripcionT;
            this.Costo = costo;
            this.Precio_Venta = precio_v;
            this.Cantidad = cant;
        }

        public ProductoDTO() { }

        public long Id_Producto { get; set; }
        public string Descripcion { get; set; }
        public int Id_Tipo { get; set; }
        public string descripcionT { get; set; }
        public decimal Costo { get; set; }
        public decimal Precio_Venta { get; set; }
        public long Cantidad { get; set; }
    }

}
